﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using AutoLoL.Entities;
using AutoLoL.Logic.Utils;
using AutoLoL.Shared;
using System.Xml.Linq;

namespace AutoLoL.Logic
{
    public class SummonerSpellRepository
    {
        private static ReadOnlyCollection<SummonerSpell> _summonerSpells;

        public static SummonerSpell GetByName(string summonerSpellName)
        {
            if (string.IsNullOrEmpty(summonerSpellName))
            {
                return null;
            }

            return GetAll().Where(c => c.Name.ToLower().Equals(summonerSpellName.ToLower())).SingleOrDefault();
        }

        public static ReadOnlyCollection<SummonerSpell> GetAll(bool cached = true)
        {
            if (_summonerSpells == null || !cached)
            {
                List<SummonerSpell> summonerSpells = new List<SummonerSpell>();

                if (File.Exists(Constants.SPELLS_XML_FILE))
                {
                    XDocument itemsDoc = XDocument.Load(Constants.SPELLS_XML_FILE);
                    foreach (XElement itemElement in itemsDoc.Root.Elements("spell"))
                    {
                        string name = itemElement.Element("name").Value;
                        string icon = itemElement.Element("icon").Value;
                        string description = itemElement.Element("description").Value;

                        string iconPath = Path.Combine(Constants.SPELLS_DIRECTORY, icon);

                        SummonerSpell summonerSpell = new SummonerSpell();
                        summonerSpell.Name = name;
                        summonerSpell.IconBitmapImage = ImageConverter.ConvertFileToBitmapImage(iconPath);
                        summonerSpell.Description = description;

                        summonerSpells.Add(summonerSpell);
                    }
                }

                summonerSpells.Sort((x1, x2) => x1.Name.CompareTo(x2.Name));
                _summonerSpells = new ReadOnlyCollection<SummonerSpell>(summonerSpells);
            }

            return _summonerSpells;
        }
    }
}